package zisu.netty.practice.RPC.client.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import zisu.netty.practice.RPC.utils.Serialization;

import java.util.List;

/**
 * @Desc: ""
 * @Author: caixiang
 * @DATE: 2021/1/19 13:51
 */
public class RpcDecode extends ByteToMessageDecoder {
    private Class<?> genericClass;

    public RpcDecode(Class<?> genericClass){
        this.genericClass = genericClass;
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        //如果拿到的数据小于4个字节（4个字节 就是Integer） ，我们就直接舍弃了 因为是上次没传完的数据。
        if(in.readableBytes() < 4 ){
            return;
        }
        //首先记录下当前位置，，记录之后，就能reset了。
        in.markReaderIndex();

        // 当前请求数据包的大小读取出来。
        int dataLength = in.readInt();
        if(in.readableBytes()<dataLength){
            //恢复到一开始 的读索引位置，这边没接受完全，那我下次 再读好了。
            in.resetReaderIndex();
            return;
        }

        //真正读取 真实数据包长度 的字节数
        byte[] data = new byte[dataLength];
        //in.readBytes()把内容从缓存 buffer中读到 dataLength中去。
        in.readBytes(data);

        //解码操作 返回指定的对象
        Object deserialize = Serialization.deserialize(data, genericClass);
        //填充到buffer，传播到下游handler , 做实际的业务处理。
        out.add(deserialize);

    }
}
